package main

import (
	"bigdevops/src/agent"
	"bigdevops/src/agent/cron"
	"bigdevops/src/agent/job"
	"bigdevops/src/common"
	"bigdevops/src/config"
	"bigdevops/src/web"
	"context"
	"flag"
	"fmt"
	esl "github.com/ning1875/errgroup-signal/signal"
	"go.uber.org/zap"
)

func main() {

	// 主配置文件 命令行参数
	var (
		configFile string
	)

	flag.StringVar(&configFile, "config_file", "./agent.yml", "The config yml")

	flag.Parse()

	//fmt.Printf("主配置文件路径:%v\n", configFile)
	sc, err := config.LoadAgent(configFile)
	if err != nil {
		fmt.Printf("解析主配置文件错误:%v\n", err)
		return
	}

	// agent日志  给加个 主机名和ip地址的标识

	hostName := common.GetHostName()
	localIp := common.GetLocalIp()
	sc.HostName = hostName
	sc.LocalIp = localIp

	// 初始化logger的时候就加上去 ，后面使用这个logger的都会有这个标识
	logger := common.NewZapLogger(sc.LogLevel, sc.LogFilePath).With(
		zap.String("hostName", sc.HostName),
		zap.String("localIp", sc.LocalIp),
	)

	defer logger.Sync() // flushes buffer, if any

	sc.Logger = logger
	logger.Info("解析主配置文件成功 logger初始化成功")

	client := agent.NewGrpcClient(sc)

	// 先初始化这个taskManager
	tm := job.NewTaskManager(sc)

	// 计划任务管理器
	cm := cron.NewCronManager(client, tm)

	// 初始化这个group
	// stopChan 有值，说明要退出 esl "github.com/ning1875/errgroup-signal/signal"
	group, stopChan := esl.SetupStopSignalContext()
	ctxAll, cancelAll := context.WithCancel(context.Background())

	// 首先添加一个退出信号管理

	group.Go(func() error {
		logger.Info("[stopchan监听启动]")
		for {
			select {
			case <-stopChan:
				logger.Info("捕获退出信号 停止ctx 通知所有任务退出")
				cancelAll()
				return nil
			}

		}
	})

	group.Go(func() error {

		errChan := make(chan error, 1)
		go func() {
			errChan <- web.AgentStartGin(sc)
		}()

		logger.Info("web启动成功")
		select {
		case err := <-errChan:
			logger.Error("gin报错", zap.Error(err))
			return err
		case <-ctxAll.Done():
			logger.Info("gin收到其他任务退出信号 退出")
			return nil
		}
	})

	// 在里面添加你的任务
	{
		if sc.InfoCollectC.Enable {
			group.Go(func() error {

				logger.Info("计划任务--元信息采集上报--启动")
				err := cm.InfoReportManager(ctxAll)
				if err != nil {
					logger.Error("计划任务--元信息采集上报--报错", zap.Error(err))
				}
				return err
			})
		} else {
			logger.Info("计划任务--元信息采集上报--关闭")
		}

	}

	{
		if sc.JobExecC.Enable {
			logger.Info("任务执行模块开启")

			//
			//os.MkdirAll(sc.JobExecC.MetaDir, os.ModePerm)
			//os.Chmod(sc.JobExecC.MetaDir, 0777)
			// 本地进行测试

			//job.MockTaskRun(sc)
			group.Go(func() error {

				logger.Info("计划任务--任务执行模块--启动")
				err := cm.JobExecManager(ctxAll)
				if err != nil {
					logger.Error("计划任务--任务执行模块--报错", zap.Error(err))
				}
				return err
			})
		} else {
			logger.Info("任务执行模块关闭")
		}

	}
	group.Wait()

}
